#include "Main.h"

mem::CMemory* Mem = new mem::CMemory();

void HandleCommands()
{
	while(pipe->GetCommand())
	{
		HandleMessages(pipe->GetCommandMessage());
	}
}

void MainThread()
{
	while(true)
	{
		HandleCommands();

		Sleep(1);
	}
}

void Initialize()
{
	Mem->AddSignature("Player X",
		"Game.exe",
		reinterpret_cast<byte*>("\xD9\x1D\x00\x00\x00\x00\xD9\x81\x00\x00\x00\x00\xD9\x1D\x00\x00\x00\x00\xD9\xEE"),
		"xx????xx????xx????xx",
		+2);
	
	Mem->AddSignature("Camera X",
		"Game.exe",
		reinterpret_cast<unsigned char*>("\x68\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x84\xC0\x74\x0C\x6A\x07\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8A\x86\xA0\x14\x00\x00\x3A\xC3"),
		"x????x????x????xxxxxxx????x????xxxxxxxx",
		+1);
	
	Mem->AddressMap["Player Y"] = Mem->GetAddress("Player X") + 4;
	Mem->AddressMap["Camera Y"] = Mem->GetAddress("Camera X") + 4;
	Mem->AddressMap["Camera Z"] = Mem->GetAddress("Camera Y") + 4;

	Mem->AddSignature(
		"CPlayerMgrPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\xB8\x00\x00\x00\x00\x8B\xCE\xE8\x00\x00\x00\x00\x3B\xC7\x74\xBE\x32\xC0"),
		"x????x????xx????xxx????xxxxxx",
		+0x1);

	Mem->AddSignature(
		"GetMeFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x89\x75\xE0\x8D\x4D\xE0\x51\x8D\x4D\xE8\xE8\x00\x00\x00\x00\x84\xC0\x74\x18\x8B\x87\x00\x00\x00\x00\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59\x5F\x5E\x5B\x8B\xE5\x5D\xC3\x8D\x4D\xE8\xE8\x00\x00\x00\x00"),
		"xxxxxxxxxxx????xxxxxx????xxxxxx????xxxxxxxxxxxx????",
		-0x5B);

	Mem->AddSignature(
		"FindByNameFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x8B\xF9\x33\xDB\x89\x5D\xFC\x89\x5D\xE8\x8D\x77\x60\x8B\x46\x04\x8B\x00\x89\x5D\xD8\x8B\xCE\x89\x4D\xD8\x89\x4D\xE8\x89\x45\xEC\xEB\x03\x8D\x49\x00"),
		"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
		-0x2B);

	Mem->AddSignature(
		"FindPlayerByIdFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x8B\xF9\x33\xDB\x89\x5D\xFC\x81\x7D\x00\x00\x00\x00\x00\x75\x1A\x8B\x87\x00\x00\x00\x00\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59"),
		"xxxxxx????xxxxxxxxxxxx?????xxxx????xxxxxx????x",
		-0x1E);

	Mem->AddSignature(
		"TurnToPlayerFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x89\x65\xF0\x8B\xF1\xC7\x45\x00\x00\x00\x00\x00\x9B\x6A\x02\xE8\x00\x00\x00\x00\x84\xC0\x74\x15\x9B\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59"),
		"xxxxxxx?????xxxx????xxxxxxxxxxx????x",
		-0x28);

	Mem->AddSignature(
		"CBagPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x80\x7D\x08\x00\x74\x21\x0F\xB6\x05\x89\x1E\x1D\x01\x50\x0F\xB6\x0D\x88\x1E\x1D\x01\x51\x8B\x15\x00\x00\x00\x00\x52\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xB0\x01\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59\x5F"),
		"xxxxxxxxxxxxxxxxxxxxxxxx????xx????x????xxxxxxxx????xx",
		+0x1E);

	Mem->AddSignature(
		"GetItemIdByIndexFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\xC7\x45\x00\x00\x00\x00\x00\x8B\x89\x00\x00\x00\x00\x85\xC9\x75\x17\x66\x33\xC0\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59\x5F"),
		"xxxxx????xxxxx?????xx????xxxxxxxxxxxxx????xx",
		-0x1D);

	Mem->AddSignature(
		"CTargetPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x6A\x00\xE8\x00\x00\x00\x00\x8B\xC8\xE8\x00\x00\x00\x00\x80\x7C\x24\x14\x00\x74\x0F\x6A\x00\x6A\xFF\x56\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xF6\x87\xF8\x14\x00\x00\x08"),
		"x????x????xxx????xxx????xxxxxxxxxxxxx????x????xxxxxxx",
		+0x1);

	Mem->AddSignature(
		"SelectTargetFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x56\x8B\x74\x24\x0C\x57\x8B\xE9\xC7\x05\x00\x00\x00\x00\x00\x00\x00\x00\x56\x89\xB5\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x56\x8B\xCD\xE8\x00\x00\x00\x00\x8B\xF8\x80\xBF\xA0\x14\x00\x00\x00\x0F\x85\x00\x00\x00\x00"),
		"xxxxxxxxxxx????????xxx????x????xxxx????xxxxxxxxxxx????",
		0);

	Mem->AddSignature(
		"UseSkillFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x44\xA1\x00\x00\x00\x00\x33\xC5\x89\x45\xEC\x53\x56\x57\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x33\xFF\x89\x7D\xFC\xC7\x45\x00\x00\x00\x00\x00"),
		"xxxxxx????xx????xxxxx????xxxxxxxxxxxxxx????xxxxxxxxxx?????",
		0);

	Mem->AddSignature(
		"CMonsterDropMgrPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\x47\x58\x89\x47\x50\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59"),
		"x????x????xxxxxxx????x????x????xxxxxx????x",
		+1);

	Mem->AddSignature(
		"PlayerIterNextFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x56\x8B\xF1\x83\x3E\x00\x75\x05\xE8\x00\x00\x00\x00\x8B\x46\x04\x80\x78\x15\x00\x74\x06\x5E\xE9\x00\x00\x00\x00\x8B\x48\x08\x80\x79\x15\x00\x75\x1A\x8B\x01\x80\x78\x15\x00"),
		"xxxxxxxxx????xxxxxxxxxxx????xxxxxxxxxxxxxxx",
		0);

	Mem->AddSignature(
		"CPetPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xC3\xE8\x00\x00\x00\x00\x8B\xC8\xE8\x00\x00\x00\x00\x80\xB8\x0C\x13\x00\x00\x00\x75\x1B\x8B\xC8\xE8\x00\x00\x00\x00\x8B\x48\x10\x8B\x40\x14"),
		"x????x????xx????xxx????xxxxxxxxxxxx????xxxxxx",
		+1);

	Mem->AddSignature(
		"CPetMgrPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x04\xC6\x84\x24\x98\x01\x00\x00\x03\x8B\x0D\x00\x00\x00\x00\x3B\xCF\x75\x04\x33\xC0\xEB\x0A\xA1\x00\x00\x00\x00\x2B\xC1\xC1\xF8\x02\x8B\x8E\x00\x00\x00\x00"),
		"x????x????x????x????xxxxxxxxxxxxx????xxxxxxxxx????xxxxxxx????",
		+1);

	Mem->AddSignature(
		"GetPetIdByIndexFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x51\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\xC7\x45\x00\x00\x00\x00\x00\x8B\x7D\x08\x85\xFF\x7C\x46\x8D\xB1\x00\x00\x00\x00\x8B\xCE\xE8\x00\x00\x00\x00\x50"),
		"xxxxxx????xx????xxxxxx????xxxxxxxx????xxxxx?????xxxxxxxxx????xxx????x",
		0);

	Mem->AddSignature(
		"SummonPetFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x18\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\xC7\x45\x00\x00\x00\x00\x00\x8B\x75\x0C\x56"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxx?????xxxx",
		0);

	Mem->AddSignature(
		"CNpcDialogPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8D\x55\xE4\x52\x8B\xCF\xE8\x00\x00\x00\x00\x9B\xC7\x45\x00\x00\x00\x00\x00\x8B\x4D\xF4\x64\x89\x0D\x00\x00\x00\x00\x59\x5F\x5E\x5B"),
		"x????x????xxxxxxx????xxx?????xxxxxx????xxxx",
		+1);

	Mem->AddSignature(
		"QuestAcceptFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x83\xEC\x10\x56\x8B\xF1\x66\x8B\x46\x58\xC6\x44\x24\x0F\x00\xC6\x44\x24\x0E\x00\x66\xC7\x44\x24\x0C\xF2\x2C\xC7\x44\x24\x00\x00\x00\x00\x00\x66\x89\x44\x24\x10\xE8\x00\x00\x00\x00\x8B\x10\x8B\x52\x0C\x8D\x4C\x24\x04\x51\x8B\xC8\xFF\xD2"),
		"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?????xxxxxx????xxxxxxxxxxxxxx",
		0);

	Mem->AddSignature(
		"QuestRewardFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x83\xEC\x10\x56\x8B\xF1\x66\x8B\x46\x58\xC6\x44\x24\x0F\x00\xC6\x44\x24\x0E\x00\x66\xC7\x44\x24\x0C\xF4\x2C\xC7\x44\x24\x00\x00\x00\x00\x00\x66\x89\x44\x24\x10\xE8\x00\x00\x00\x00\x8B\x10\x8B\x52\x0C\x8D\x4C\x24\x04\x51\x8B\xC8"),
		"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx?????xxxxxx????xxxxxxxxxxxx",
		0);

	Mem->AddSignature(
		"TryTalkWithNpcFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x10\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x8B\xF9\xC7\x45\x00\x00\x00\x00\x00\x9B\x8B\x75\x08\x85\xF6\x74\x4F\xE8\x00\x00\x00\x00\x83\xB8\x80\x01\x00\x00\x00"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxxxx?????xxxxxxxxx????xxxxxxx",
		0);

	Mem->AddSignature(
		"DestroyItemFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x51\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\xC7\x45\x00\x00\x00\x00\x00\x80\x7D\x08\x01\x75\x29\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\x75\x0C\x88\x46\x0C\xE8\x00\x00\x00\x00"),
		"xxxxxx????xx????xxxxxx????xxxxxxxx????xxxxx?????xxxxxxx????x????xxxxxxx????",
		0);

	Mem->AddSignature(
		"RepairItemsFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x14\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x33\xC0\x89\x45\xFC\x38\x45\x08\x74\x43\x88\x45\xEB\x88\x45\xEA"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxxxxxxxxxxxxxxxx",
		0);

	Mem->AddSignature(
		"CNetworkInputPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x84\x05\xBC\x89\xF9\x00\x75\x2D\x09\x05\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x04\xC7\x44\x24\x00\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x8B\x4C\x24\x04\x64\x89\x0D\x00\x00\x00\x00\x59\x83\xC4\x0C\xC3"),
		"xxxxxxxxxx????xxx?????x????x????x????x????xxxxxx?????x????xxxxxxx????xxxxx",
		+0x17);

	Mem->AddSignature(
		"SendPickupAllItemsFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x14\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x33\xD2\x89\x55\xFC\x8B\x41\x0C\x3B\xC2\x74\x34"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxxxxxxxxxxxx",
		0);

	Mem->AddSignature(
		"WorldToScreenFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x81\xEC\x00\x00\x00\x00\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x8B\xC1\xC7\x45\x00\x00\x00\x00\x00\x9B\x8D\xB0\x00\x00\x00\x00"),
		"xxxxxx????xx????xxx????xxxx????xxxxxxxx????xxxxxxx?????xxx????",
		0);

	Mem->AddSignature(
		"HR3DPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xA1\x00\x00\x00\x00\x8B\x15\x00\x00\x00\x00\x55\x56\x8B\xF1\xD9\x86\x00\x00\x00\x00\x52\xD9\x5C\x24\x18\x33\xED\xD9\x86\x00\x00\x00\x00\x89\x6C\x24\x10\xD9\x5C\x24\x1C\x89\x6C\x24\x0C\xD9\x86\x00\x00\x00\x00\x8D\x54\x24\x0C\xD9\x5C\x24\x20\x8B\x88\x00\x00\x00\x00"),
		"x????xx????xxxxxx????xxxxxxxxx????xxxxxxxxxxxxxx????xxxxxxxxxx????",
		+1);

	Mem->AddSignature(
		"ScreenSizePtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xA1\x00\x00\x00\x00\x50\x52\x8D\x44\x24\x18\x50\x8D\x54\x24\x24\x52\xE8\x00\x00\x00\x00\x84\xC0\x0F\x84\x00\x00\x00\x00\x39\xAE\x00\x00\x00\x00"),
		"x????xxxxxxxxxxxxx????xxxx????xx????",
		+1);

	Mem->AddSignature(
		"GetZByXYFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x0C\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x8B\xD9\xC7\x45\x00\x00\x00\x00\x00\x9B\xD9\x83\x00\x00\x00\x00\xD8\x0D\x00\x00\x00\x00\xD9\x5D\xE8\xD9\x45\x08\xD9\x45\xE8"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxxxx?????xxx????xx????xxxxxxxxx",
		0);

	Mem->AddSignature(
		"HR3DWorldPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\xA1\x00\x00\x00\x00\x33\xC4\x50\x8D\x44\x24\x04\x64\xA3\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x84\x05\x00\x87\x3A\x03\x75\x2D\x09\x05\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x04"),
		"xxx????xx????xx????xxxxxxxxx????x????xxxxxxxxxx????xxx?????x????x????x????x????xxx",
		+0x3C);

	Mem->AddSignature(
		"RButtonUpFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x2C\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x8B\xF9\xC7\x45\x00\x00\x00\x00\x00\x83\x7F\x58\xFF\x0F\x84\x00\x00\x00\x00\xE8\x00\x00\x00\x00"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxxxx?????xxxxxx????x????",
		0);

	Mem->AddSignature(
		"MousePosPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xA1\x00\x00\x00\x00\x50\xE8\x00\x00\x00\x00\x88\x5D\x0B\x8D\x4D\x0B\x51\x8D\x55\xDC\x52\x8D\x45\xD0\x50\xE8\x00\x00\x00\x00\x8B\xC8\xE8\x00\x00\x00\x00\x84\xC0"),
		"x????xx????xxxxxxxxxxxxxxxx????xxx????xx",
		+1);

	Mem->AddSignature(
		"ChangeRealmFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x50\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC4\x50\x8D\x44\x24\x60\x64\xA3\x00\x00\x00\x00\x8B\xF1\x66\x8B\x15\xC4\x4C\xED\x00\x33\xDB\x66\x3B\xD3\x0F\x86\x00\x00\x00\x00\x33\xFF\x8D\x64\x24\x00"),
		"xxx????xx????xxxxxxxx????xxxxxxxxx????xxxxxxxxxxxxxxxx????xxxxxx",
		0);

	Mem->AddSignature(
		"ServerInfoPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x0F\xB7\x15\xC4\x4C\xED\x00\x52\x51\x50\x6A\x02\x8D\x85\x00\x00\x00\x00\x50\xE8\x00\x00\x00\x00\x83\xC4\x14\x39\xB5\x00\x00\x00\x00\x8B\x85\x00\x00\x00\x00\x73\x06\x8D\x85\x00\x00\x00\x00"),
		"xxx????xxxxxxx????xx????xxxxx????xx????xxxx????",
		+3);

	Mem->AddSignature(
		"ExitWaitPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xA1\x00\x00\x00\x00\x8B\x50\x24\x68\x00\x00\x00\x00\x6A\x00\x6A\x00\x6A\x00\xB9\x00\x00\x00\x00\xFF\xD2\xE8\x00\x00\x00\x00\xC7\x80\x00\x00\x00\x00\x00\x00\x00\x00\xEB\x57\x83\xC0\x0E\x50\x8D\x4C\x24\x0C\xE8\x00\x00\x00\x00"),
		"x????xxxx????xxxxxxx????xxx????xx????????xxxxxxxxxxx????",
		+1);

	Mem->AddSignature(
		"LineSelectionPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x84\xC0\x74\x11\x53\x53\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xE9\x00\x00\x00\x00\xE8\x00\x00\x00\x00"),
		"x????x????xxxxxxx????x????x????x????",
		+1);

	Mem->AddSignature(
		"InternalGetTimeFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x53\x56\xA1\x00\x00\x00\x00\x33\xC4\x50\x8D\x44\x24\x0C\x64\xA3\x00\x00\x00\x00\x8B\x35\x00\x00\x00\x00\xBB\x00\x00\x00\x00\x84\x1D\xF8\xC1\xB9\x00\x75\x1D\x09\x1D\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xFF\xD6"),
		"xxx????xx????xxxx????xxxxxxxxx????xx????x????xxxxxxxxxx????xxx?????xx",
		0);

	Mem->AddSignature(
		"MoveByMapXYFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x83\xEC\x14\x56\x8B\xF1\xE8\x00\x00\x00\x00\x83\xB8\xAC\x02\x00\x00\x00\x0F\x84\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xB8\xB0\x02\x00\x00\x00\x0F\x84\x00\x00\x00\x00\xD9\x44\x24\x24\x53\x55\x8B\x6C\x24\x24\x57\x83\xEC\x08\xD9\x5C\x24\x04\xD9\x44\x24\x34\xD9\x1C\x24\x55\xE8\x00\x00\x00\x00"),
		"xxxxxxx????xxxxxxxxx????x????xxxxxxxxx????xxxxxxxxxxxxxxxxxxxxxxxxxxx????",
		0);

	Mem->AddSignature(
		"CAutoPathPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x8D\x44\x24\x04\x64\xA3\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x84\x05\x64\xDB\xEE\x00\x75\x2D\x09\x05\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x04\xC7\x44\x24\x00\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x8B\x4C\x24\x04\x64\x89\x0D\x00\x00\x00\x00\x59\x83\xC4\x0C\xC3"),
		"xxxxxx????x????xxxxxxxxxx????xxx?????x????x????x????x????xxxxxx?????x????xxxxxxx????xxxxx",
		+0x26);

	Mem->AddSignature(
		"MapIdPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x8B\x0D\x00\x00\x00\x00\x51\xE8\x00\x00\x00\x00\x8B\xC8\x81\xC1\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\x80\x00\x00\x00\x00\x83\xF8\x03\x75\x16"),
		"xx????xx????xxxx????x????xx????xxxxx",
		+2);

	Mem->AddSignature(
		"CPartyPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x8D\x44\x24\x04\x64\xA3\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x84\x05\xFC\xE1\xEE\x00\x75\x2D\x09\x05\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00"),
		"xxxxxx????x????xxxxxxxxxx????xxx?????x????x????",
		+0x26);

	Mem->AddSignature(
		"FollowPlayerFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x8B\x44\x24\x04\x89\x81\x90\x90\x00\x00\xC2\x04\x00"),
		"xxxxxxxxxxxxx",
		+6);

	Mem->AddSignature(
		"CPlayerRolePtr",
		"Game.exe",
		reinterpret_cast<byte*>("\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x6A\x00\x6A\x01\x6A\xFF\x6A\x00\x6A\x00\x8B\xCE\xE8\x00\x00\x00\x00\xB0\x01\x5E\x59\xC2\x04\x00"),
		"x????x????xxxxxxxxxxxxx????xxxxxxx",
		+1);

	Mem->AddSignature(
		"SendPckFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x08\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\x8B\xF9\x33\xDB\x89\x5D\xFC\x8B\x75\x08\x3B\xF3"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxxxxxxxxxxxx",
		0);

	Mem->AddSignature(
		"CNetworkInputPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x8D\x44\x24\x04\x64\xA3\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x84\x05\xBC\x89\xF9\x00\x75\x2D\x09\x05\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x04\xC7\x44\x24\x00\x00\x00\x00\x00\xB8\x00\x00\x00\x00"),
		"xxxxxx????x????xxxxxxxxxx????xxx?????x????x????x????x????xxxxxx?????x????",
		+0x26);

	Mem->AddSignature(
		"InteractFunction",
		"Game.exe",
		reinterpret_cast<byte*>("\x55\x8B\xEC\x6A\xFF\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x83\xEC\x18\x53\x56\x57\xA1\x00\x00\x00\x00\x33\xC5\x50\x8D\x45\xF4\x64\xA3\x00\x00\x00\x00\x89\x65\xF0\xC7\x45\x00\x00\x00\x00\x00\x8B\x75\x08\x39\xB1\x00\x00\x00\x00\x74\x11"),
		"xxxxxx????xx????xxxxxxxx????xxxxxxxx????xxxxx?????xxxxx????xx",
		0);

	Mem->AddSignature(
		"AutoLootPatch1",
		"Game.exe",
		reinterpret_cast<byte*>("\x74\x10\x8B\x4E\x0C\x51\xE8\x00\x00\x00\x00\x8B\xC8\xE8\x00\x00\x00\x00\x8D\x4D\xD0\xE8\x00\x00\x00\x00\x8B\x16\x89\x55\xD0"),
		"xxxxxxx????xxx????xxxx????xxxxx",
		0);

	Mem->AddSignature(
		"AutoLootPatch2",
		"Game.exe",
		reinterpret_cast<byte*>("\x74\x14\x8D\x45\x08\x50\x8B\x4D\x04\x51\xE8\x00\x00\x00\x00\x8B\xC8\xE8\x00\x00\x00\x00\x83\x45\x00\x01\xE9\x00\x00\x00\x00\xD9\x46\x08\xD9\x1F"),
		"xxxxxxxxxxx????xxx????xxxxx????xxxxx",
		0);

	Mem->AddSignature(
		"CombatAidPtr",
		"Game.exe",
		reinterpret_cast<byte*>("\x64\xA3\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x84\x05\x3C\xD8\xEE\x00\x75\x2D\x09\x05\x00\x00\x00\x00\xC7\x44\x24\x00\x00\x00\x00\x00\xB9\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x04\xC7\x44\x24\x00\x00\x00\x00\x00\xB8\x00\x00\x00\x00\x8B\x4C\x24\x04"),
		"xx????x????xxxxxxxxxx????xxx?????x????x????x????x????xxxxxx?????x????xxxx",
		+0x22);

	CPlayerMgr::Init();
	CBag::Init();
	CTarget::Init();
	CPet::Init();
	CNpcDialog::Init();
	CServer::Init();
	CParty::Init();
}

void WriteJMP(byte* location, byte* newFunction, byte* oldCode)
{
	DWORD dwOldProtection;
	VirtualProtect(location, 5, PAGE_EXECUTE_READWRITE, &dwOldProtection);

	if(oldCode)
		memcpy(oldCode, location, 5);

	*(byte*)location = (byte)0xE9;
	*(dword*)(location + 1) = newFunction - location - 5;
	VirtualProtect(location, 5, dwOldProtection, &dwOldProtection);
}

void RemoveJMP(byte* location, byte* oldCode)
{
	DWORD dwOldProtection;
	VirtualProtect(location, 5, PAGE_EXECUTE_READWRITE, &dwOldProtection);
	memcpy(location, oldCode, 5);
	VirtualProtect(location, 5, dwOldProtection, &dwOldProtection);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
	if(dwReason == DLL_PROCESS_ATTACH)
	{
		pipe->SetRequestFunction(HandleMessages);

		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&Initialize, NULL, NULL, NULL);
		CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&MainThread, NULL, NULL, NULL);

		/* Code to be added
		 */

		return true;
	}
	return false;
}